package trucaso;

import java.util.Arrays;
import java.util.Random;
import naivebayes.*;

public class GameFlowHandler {
	
	private Game game;
	private ChatPane chatPane;
	private double contador = 0.0;
	private BayesClassifier <String, String> bayes =  new BayesClassifier<String, String>();;
	
	public void reset(){
		contador = 0.0;
	}
	
	public ChatPane getChatPane() {
		return chatPane;
	}

	public void setChatPane(ChatPane chatPane) {
		this.chatPane = chatPane;
	}

	public GameFlowHandler(Game game){
		this.game = game;
		bayes.learn("mentira", Arrays.asList("idJugador"));
		bayes.learn("verdad", Arrays.asList("idJugador"));
	}
	
	public void startGame(){

	}
	
	public Game getGame() {
		return game;
	}

	public void setGame(Game game) {
		this.game = game;
	}
	
	int sumarValoresEnvido(Card a, Card b){
		if (a.getEnvidoValue() == 0 && b.getEnvidoValue() == 0){
			return 20;
		} else if (a.getEnvidoValue() == 0 && b.getEnvidoValue() != 0){
			return 20 + b.getEnvidoValue();
		} else if (a.getEnvidoValue() != 0 && b.getEnvidoValue() == 0){
			return 20 + a.getEnvidoValue();
		} else {
			return 20 + a.getEnvidoValue() + b.getEnvidoValue();
		}
	}
	
	int obtenerTantos(Card a, Card b, Card c){
		if (a.type == b.type && a.type != c.type){
			return (sumarValoresEnvido(a, b));			 
		} else if (a.type != b.type && a.type == c.type){
			return (sumarValoresEnvido(a, c));
		} else if (b.type == c.type && b.type != a.type){
			return (sumarValoresEnvido(b, c));
		} else if (a.type == b.type && a.type == c.type){
			int ab = sumarValoresEnvido(a, b);
			int ac = sumarValoresEnvido(a, c);
			int bc = sumarValoresEnvido(b, c);
			int max = Math.max(ab, ac);
			return Math.max(max, bc);
		} else {
			int max = Math.max(a.getEnvidoValue(), b.getEnvidoValue());
			return Math.max(max, c.getEnvidoValue());
		}
	}
	
	public Double probabilidadDePerderEnvido(int tantos){
		if (tantos == 33){
			return 0.02;
		} else if (tantos  == 32){
			return 0.03;
		} else if (tantos == 31){
			return 0.06;
		} else if (tantos == 30){
			return 0.09;
		} else if (tantos == 29){
			return 0.13;
		} else if (tantos == 28){
			return 0.17;
		} else if (tantos == 27){
			return 0.25;
		} else if (tantos == 26){
			return 0.32;
		} else if (tantos == 25){
			return 0.38;
		} else if (tantos == 24){
			return 0.43;
		} else if (tantos == 23){
			return 0.48;
		} else if (tantos == 22){
			return 0.52;
		} else if (tantos == 21){
			return 0.56;
		} else if (tantos == 20){
			return 0.60;
		} else if (tantos == 7){
			return 0.70;
		} else if (tantos == 6){
			return 0.79;
		} else if (tantos == 5){
			return 0.86;
		} else if (tantos == 4){
			return 0.91;
		} else if (tantos == 3){
			return 0.95;
		} else if (tantos == 2){
			return 0.97;
		} else if (tantos == 1){
			return 0.99;
		} else if (tantos == 0){
			return 1.00;
		}
		return 0.50;
	}
	
	public void meVoy(){
		if (game instanceof LocalClient){
			((LocalClient) game).getCards();
			game.cardZone.repaint();
		}
		
//		int tantosJugador = obtenerTantos(game.both[3], game.both[4], game.both[5]);
//		getChatPane().putMessage("Jugador tiene de tantos " + tantosJugador);
	}

	public void envido(){
		getChatPane().putMessage("###################");
		int tantosJugador = obtenerTantos(game.both[3], game.both[4], game.both[5]);
		getChatPane().putMessage("Jugador tiene de tantos " + tantosJugador);
		getChatPane().putMessage("jugador dice Envido");
		
		Integer tantosCPU = obtenerTantos(game.both[0], game.both[1], game.both[2]);		
		Double prob = probabilidadDePerderEnvido(tantosCPU);
		
		prob = prob - contador;
		
		int cota = (int) (prob * 100);
		Random r;
		r = new Random();
		Integer result = r.nextInt(101);
		
		
		if (cota <= result){
			System.out.println("CPU Acepta con " + tantosCPU.toString() + " y % de perder " + prob + "%" + " Cota = " + cota + " Random = " + result);
			getChatPane().putMessage("CPU dice Quiero");			
			
			getChatPane().putMessage("Jugador canta " + tantosJugador);
			getChatPane().putMessage("CPU canta " + tantosCPU);
			
			if (tantosJugador < 25)
				bayes.learn("mentira", Arrays.asList("idJugador"));
			else
				bayes.learn("verdad", Arrays.asList("idJugador"));
			
		} else {
			System.err.println("CPU No Acepta con " + tantosCPU.toString() + " y % de perder " + prob + "%" + " Cota = " + cota + " Random = " + result);			
			getChatPane().putMessage("CPU dice NO Quiero");
		}
		
/*		if (tantosJugador < 20){
			contador = contador + 0.05;
		} else if (tantosJugador < 25){
			contador = contador + 0.03;
		} else if (tantosJugador <= 26){			
			contador = contador + 0.01;
		} else {
			contador = contador - 0.02;
		}
*/	
		if (bayes.classify(Arrays.asList("idJugador")).getCategory() == "mentira")
			contador += 0.03;
		else
			contador -= 0.03;

		if (contador > 0.15){
			contador = 0.15;
		}
		if (contador < -0.1){
			contador = -0.1;
		}
		
		System.out.println(bayes.getCategoriesTotal());
		System.out.println(bayes.classify(Arrays.asList("idJugador")).toString());
		System.out.println("Factor de mentira jugador " + contador * 100 + "%");	
		
		meVoy();
	}

}
